package jp.androidgroup.chiba.androidresearch;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.SharedPreferences;

/**
 * ユーザ情報を保持するJavaBeansのようなオブジェクトです。<br>
 * 岡田さんの勉強会コメントを参考に、ただデータを保持するだけのオブジェクトって<br>
 * オブジェクトじゃないよね？ということから、JSONやSharedPreferencesの値から<br>
 * UserInfoオブジェクトを生成するような処理を少し加えています。
 * @author y-yamaguchi
 *
 */
public class UserInfo {

	private String email;
	private String familyName;
	private String givenName;
	private String gender;
	private String id;
	private String link;
	private String locale;
	private String name;
	private String picture;
	private boolean verifiedEmail;

	/**
	 * JSONObjectからユーザ情報を取得し設定します。<br>
	 * JSONObject内にユーザ情報が設定されていない場合はIDなどの文字列型が全てnullとなります。
	 *
	 * @param json
	 *            JSONObject
	 * @throws JSONException
	 */
	public UserInfo(JSONObject json) throws JSONException {
		if (json != null) {
			setEmail(json.has(Constants.KEY_EMAIL) ? json
					.getString(Constants.KEY_EMAIL) : null);
			setFamilyName(json.has(Constants.KEY_FAMILY_NAME) ? json
					.getString(Constants.KEY_FAMILY_NAME) : null);
			setGivenName(json.has(Constants.KEY_GIVEN_NAME) ? json
					.getString(Constants.KEY_GIVEN_NAME) : null);
			setGender(json.has(Constants.KEY_GENDER) ? json
					.getString(Constants.KEY_GENDER) : null);
			setId(json.has(Constants.KEY_ID) ? json.getString(Constants.KEY_ID)
					: null);
			setLink(json.has(Constants.KEY_LINK) ? json
					.getString(Constants.KEY_LINK) : null);
			setLocale(json.has(Constants.KEY_LOCALE) ? json
					.getString(Constants.KEY_LOCALE) : null);
			setName(json.has(Constants.KEY_NAME) ? json
					.getString(Constants.KEY_NAME) : null);
			setPicture(json.has(Constants.KEY_PICTURE) ? json
					.getString(Constants.KEY_PICTURE) : null);
			setVerifiedEmail(json.has(Constants.KEY_VERIFIED_EMAIL) ? json
					.getBoolean(Constants.KEY_VERIFIED_EMAIL) : false);
		}
	}

	/**
	 * SharedPreferencesからユーザ情報を取得し設定します。<br>
	 * SharedPreferences内にユーザ情報が設定されていない場合はIDなどの文字列型が全てnullとなります。
	 *
	 * @param sp
	 *            SharedPreference
	 */
	public UserInfo(SharedPreferences sp) {
		String id = sp.getString(Constants.KEY_ID, null);
		if (id != null && id.length() > 0) {
			setId(id);
			setEmail(sp.getString(Constants.KEY_EMAIL, null));
			setFamilyName(sp.getString(Constants.KEY_FAMILY_NAME, null));
			setGivenName(sp.getString(Constants.KEY_GIVEN_NAME, null));
			setGender(sp.getString(Constants.KEY_GENDER, null));
			setLink(sp.getString(Constants.KEY_LINK, null));
			setLocale(sp.getString(Constants.KEY_LOCALE, null));
			setName(sp.getString(Constants.KEY_NAME, null));
			setPicture(sp.getString(Constants.KEY_PICTURE, null));
			setVerifiedEmail(sp.getBoolean(Constants.KEY_VERIFIED_EMAIL, false));
		}
	}

	/**
	 * EMailアドレスの取得
	 *
	 * @return email
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * 姓名の姓の取得
	 *
	 * @return familyName
	 */
	public String getFamilyName() {
		return familyName;
	}

	/**
	 * 姓名の名の取得
	 *
	 * @return givenName
	 */
	public String getGivenName() {
		return givenName;
	}

	/**
	 * 性別の取得
	 *
	 * @return gender（male / female）
	 */
	public String getGender() {
		return gender;
	}

	/**
	 * GoogleアカウントのIDの設定
	 *
	 * @return id
	 */
	public String getId() {
		return id;
	}

	/**
	 * ロケールの取得
	 *
	 * @return locale（jpなど）
	 */
	public String getLocale() {
		return locale;
	}

	/**
	 * アカウント名の取得
	 *
	 * @return name
	 */
	public String getName() {
		return name;
	}

	/**
	 * 画像URLの取得
	 *
	 * @return picture
	 */
	public String getPicture() {
		return picture;
	}

	/**
	 * 検証済みのEmailの取得
	 *
	 * @return verifiedEmail（true:検証済み / false:未検証）
	 */
	public boolean isVerifiedEmail() {
		return verifiedEmail;
	}

	/**
	 * プロフィールサイトへのリンク（URL）の取得
	 *
	 * @return link
	 */
	public String getLink() {
		return link;
	}

	/**
	 * GoogleアカウントのIDの取得
	 *
	 * @param id
	 */
	private void setId(String id) {
		this.id = id;
	}

	/**
	 * EMailアドレスの設定
	 *
	 * @param email
	 */
	private void setEmail(String email) {
		this.email = email;
	}

	/**
	 * 姓名の姓の設定
	 *
	 * @param familyName
	 */
	private void setFamilyName(String familyName) {
		this.familyName = familyName;
	}

	/**
	 * 姓名の名の設定
	 *
	 * @param givenName
	 */
	private void setGivenName(String givenName) {
		this.givenName = givenName;
	}

	/**
	 * 性別の設定
	 *
	 * @param gender
	 *            （male / female）
	 */
	private void setGender(String gender) {
		this.gender = gender;
	}

	/**
	 * ロケールの設定
	 *
	 * @param locale
	 *            （jpなど）
	 */
	private void setLocale(String locale) {
		this.locale = locale;
	}

	/**
	 * アカウント名の設定
	 *
	 * @param name
	 */
	private void setName(String name) {
		this.name = name;
	}

	/**
	 * プロフィールサイトへのリンク（URL）の設定
	 *
	 * @param link
	 */
	private void setLink(String link) {
		this.link = link;
	}

	/**
	 * 画像URLの設定
	 *
	 * @param picture
	 */
	private void setPicture(String picture) {
		this.picture = picture;
	}

	/**
	 * 検証済みのEmailの設定
	 *
	 * @param verifiedEmail
	 *            （true:検証済み / false:未検証）
	 */
	private void setVerifiedEmail(boolean verifiedEmail) {
		this.verifiedEmail = verifiedEmail;
	}

	/**
	 * ユーザー情報を成形した形で表示するためのtoString()オーバーライドです。
	 * TODO:不要なら削除。
	 */
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		if (getId() != null && getId().length() > 0) {
			sb.append("■" + Constants.KEY_ID + "：" + getId() + "\n");
			sb.append("■" + Constants.KEY_EMAIL + "：" + getEmail() + "\n");
			sb.append("■" + Constants.KEY_FAMILY_NAME + "：" + getFamilyName()
					+ "\n");
			sb.append("■" + Constants.KEY_GIVEN_NAME + "：" + getGivenName()
					+ "\n");
			sb.append("■" + Constants.KEY_GENDER + "：" + getGender() + "\n");
			sb.append("■" + Constants.KEY_LOCALE + "：" + getLocale() + "\n");
			sb.append("■" + Constants.KEY_NAME + "：" + getName() + "\n");
			sb.append("■" + Constants.KEY_LINK + "：" + getLink() + "\n");
			sb.append("■" + Constants.KEY_PICTURE + "：" + getPicture() + "\n");
			sb.append("■" + Constants.KEY_VERIFIED_EMAIL + "："
					+ isVerifiedEmail() + "\n");
		} else {
			sb.append("未認証");
		}

		return sb.toString();
	}
}
